package com.springcloudalibaba.apiPay.event;

import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * @描述: 监听 - 异步修改预支付记录（生成已支付的订单）
 * @作者: lixing
 * @日期 2020/4/26 21:20
 */
@Component
@Async("asyncTaskExecutor")
@Slf4j
public class PayCallbackFailEventListener {
    @Autowired
    private RedissonClient redissonSingleClient;

    /**
     * @描述 异步修改预支付记录（生成支付失败的订单，需要做幂等）
     * @作者 lixing
     * @日期 2020/4/26 21:38
     * @Param [event]
     */
    @EventListener
    public void updatePayRecord(PayCallbackFailEvent event) {
        // 支付回调信息
        Integer client = event.getClient();
        String productId = event.getProductId();
        long userId = event.getUserId();
        Map<String, String> resultMap = event.getResultMap();
        //
//        RLock rLock = redissonSingleClient.getLock("rLock");
//        boolean res = false;
//        try {
//            // 尝试取锁
//            // 取锁超时时间1,单位为秒
//            // 取锁成功后，锁的有效期30，单位为秒（如果业务提前执行完毕也会提前释放锁），并开启后台线程（后台线程每隔10秒会检测持有的锁是否存在，存在的话就重置锁的有效期为30秒）
//            res = rLock.tryLock(1, 30, TimeUnit.MILLISECONDS);
//            if (res) {
//                UserPayOrderVo userPayOrderVo = new UserPayOrderVo();
//                userPayOrderVo.setPayStatus(PayStatusEnum.PAYMENT_FAILED.getState());
//                if (client.equals(PayClientEnum.WECHAT.getClient())) {
//                    userPayOrderVo.setOrderNo(Long.valueOf(resultMap.get("out_trade_no")));
//                } else if (client.equals(PayClientEnum.ALIBABA.getClient())) {
//                    userPayOrderVo.setOrderNo(Long.valueOf(resultMap.get("out_trade_no")));
//                }
//                // 判断当前订单的状态
//                UserPayOrderDto userPayOrderDto = userPayOrderFacede.getByOrderNo(userPayOrderVo.getOrderNo());
//                if (null != userPayOrderDto && userPayOrderDto.getPayStatus().equals(PayStatusEnum.PAYMENT_IN_PROGRESS.getState())) {
//                    // 更新订单支付状态
//                    boolean flag = userPayOrderFacede.editPayStatus(userPayOrderVo);
//                    if (flag) {
//                        log.info("");
//                        log.info(MessageFormat.format("PayCallbackFailEventListener 订单编号：{0} 修改支付状态：{1}", userPayOrderVo.getOrderNo(), flag));
//                    }
//                }
//            } else {
//                log.info(MessageFormat.format("PayCallbackFailEventListener 订单编号：{0} 修改支付状态超时", client.equals(PayClientEnum.WECHAT.getClient()) ? resultMap.get("out_trade_no") : resultMap.get("trade_no") ));
//            }
//        } catch (Exception e) {
//            log.error(MessageFormat.format("PayCallbackFailEventListener 异步修改预支付记录时出错：{0}", e.getMessage()));
//        } finally {
//            if(rLock.isLocked() && rLock.isHeldByCurrentThread()) {
//                rLock.unlock();
//            }
//        }
    }

}
